﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSE.Framework.Communication.Configuration.Adapters;
using PSE.Framework.Communication.Messages;

namespace PSE.Framework.Communication.Adapters
{
    /// <summary>
    /// Classe base dos adapters de entrada síncronos
    /// </summary>
    /// <typeparam name="TConfig">Tipo da configuração do adapter</typeparam>
    /// <typeparam name="TOpenParameter">Tipo do parâmetro de abertura do adapter</typeparam>
    /// <typeparam name="TReceiveParameter">Tipo do parâmetro de recebimento das mensagens</typeparam>
    public abstract class SyncInputAdapter<TConfig, TOpenParameter, TReceiveParameter> : BaseInputAdapter<TConfig, TOpenParameter>, ISyncInputAdapter
        where TConfig : InputAdapterConfiguration
        where TOpenParameter : class
        where TReceiveParameter : class
    {

        #region Construtor
        public SyncInputAdapter()
            : base()
        {
        }
        #endregion

        #region Receive
        /// <summary>
        /// Recebe uma mensagem de forma síncrona
        /// </summary>
        /// <returns>Retorna objeto contendo a Action e a Mensagem</returns>
        public MessageInfo Receive()
        {
            return this.Receive(null);
        }

        /// <summary>
        /// Recebe uma mensagem de forma síncrona
        /// </summary>
        /// <param name="parameter">Parâmetro de recebimento das mensagens</param>
        /// <returns>Retorna objeto contendo a Action e a Mensagem</returns>
        public abstract MessageInfo Receive(TReceiveParameter parameter);

        /// <summary>
        /// Recebe uma mensagem de forma síncrona
        /// </summary>
        /// <param name="parameter">Parâmetro de recebimento das mensagens</param>
        /// <returns>Retorna objeto contendo a Action e a Mensagem</returns>
        MessageInfo ISyncInputAdapter.Receive(object parameter)
        {
            return this.Receive((TReceiveParameter)parameter);
        }
        #endregion
    }
}
